home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / diskdup / option.c < prev    next >
Text File  |  1994-06-01  |  9KB  |  392 lines

  1. /********************************************************************
  2.  *                                                                    *
  3.  *                            DISKDUP                            *
  4.  *                                                                    *
  5.  *                        オンメモリ型 DISKCOPY                        *
  6.  *                                                                    *
  7.  *                            diskdup.exp                                *
  8.  *                                                                    *
  9.  *                            for    FM-TOWNS                            *
  10.  *                                                                    *
  11.  *            Copyright (c) ちにゃと & Tymic 1992. 1993.        *
  12.  *                                                                    *
  13.  *                        OPTION ソース                            *
  14.  *                                                                    *
  15.  ********************************************************************/
  16.  
  17. #define __OPT__                    /* ファイル ID */
  18.  
  19.  
  20. /********************************************************************
  21.     インクルードファイル
  22. *********************************************************************/
  23.  
  24. /* HI-C ライブラリ ヘッダー */
  25. #include <io.h>
  26. #include <fcntl.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <dos.h>
  30. #include <stat.h>
  31. #include <string.h>
  32. #include <memory.h>
  33.  
  34. /* ソース ヘッダー */
  35. #include "diskdup.h"
  36. #include "ddupgui.h"
  37. #include "option.h"
  38.  
  39.  
  40. /********************************************************************
  41.     変数
  42. *********************************************************************/
  43.  
  44. static ulong pan;
  45. static ulong dtlong;
  46. static char fname[256];                /* ファイル 名 バッファ */
  47. static char Headdata[32];            /* ファイル ヘッダー バッファ    */
  48.  
  49. static char Disk_2HD_120[32] = "DISKDUP MFM 2HD 1024B/S 8S 154T ";
  50. static char Disk_2DD_720[32] = "DISKDUP MFM 2DD  720B/S 9S 160T ";
  51. static char Disk_2DD_640[32] = "DISKDUP MFM 2DD  640B/S 8S 160T ";
  52. static char Disk_2HC_120[32] = "DISKDUP MFM 2HC  512B/S15S 160T ";
  53.  
  54. int flagld = 0;                        /* ロード 指定 フラグ */
  55. int flagsv = 0;                        /* セーブ 指定 フラグ */
  56. int flagfmt = 0;                    /* フォーマット 指定 フラグ */
  57. int flagipt = 0;                    /* エラー無視 指定 フラグ */
  58. int flagerr = 0;                    /* オプション エラー フラグ */
  59.  
  60.  
  61. /************************************************************
  62. 【オプション解析】
  63.  
  64.         概要    オプションパラメ-タの解析を行い結果を返す
  65.         用法    optionset( argc, argv );
  66.         引数    int        argc
  67.                 char    *argv[]
  68.         戻り値     int        0    オプション無し
  69.                         -1    オプションの指定が正しくない
  70.                         -2    ヘルプを表示
  71.                               ビットが立っていない場合   立っている場合
  72.                         bit 0    デ-タファイルをロ-ドしない / デ-タファイルをロ-ドする
  73.                             1    デ-タファイルを作成しない / デ-タファイルを作成する
  74.                             2*    フォ-マットを選択する     / フォ-マットをしない
  75.                             3*    フォ-マットを選択する     / フォ-マットをする
  76.                             4    入力を求める         / エラ-時以外は入力を求めない
  77.         注意    bit2 = 0 && bit3 = 0 の時のみフォ-マットを選択する
  78. ************************************************************/
  79.  
  80. int optionset( int argc, char *argv[] )
  81. {
  82.     int        ret = 0;
  83.     int        count;
  84.     char    c;
  85.  
  86.     /* オプション パラメータ 解析 */
  87.     if ( argc > 1 ) {
  88.         for ( count = 1; count < argc; count++ ) {
  89.             if ( ( ret != -1 ) && (ret != -2 ) ) {
  90.                 c = *argv[count];
  91.                 /* debug ****
  92.                 strcpy( str, argv[count] );
  93.                 putmessage();
  94.                 ready();
  95.                 /****/
  96.                 if ( c == '/' || c == '-' ) {
  97.                     c = *(argv[count] + 1);
  98.                     switch ( c ) {
  99.                         case 'h':
  100.                         case 'H':
  101.                         case '?':
  102.                             ret = -2;
  103.                             break;
  104.  
  105.                         case 'l':
  106.                         case 'L':
  107.                             flagld = 1;
  108.                             ret |= 1;
  109.                             break;
  110.  
  111.                         case 's':
  112.                         case 'S':
  113.                             flagsv = 1;
  114.                             ret |= 2;
  115.                             break;
  116.  
  117.                         case 'f':
  118.                         case 'F':
  119.                             flagfmt = 2;
  120.                             ret |= 8;
  121.                             break;
  122.  
  123.                         case 'd':
  124.                         case 'D':
  125.                             flagfmt = 1;
  126.                             ret |= 4;
  127.                             break;
  128.  
  129.                         case 'i':
  130.                         case 'I':
  131.                             flagipt = 1;
  132.                             ret |= 16;
  133.                             break;
  134.  
  135.                         /* 無効 パラメータ */
  136.                         default:
  137.                             ret = -1;
  138.                     }
  139.                 }
  140.                 else {
  141.                     strcpy(fname, argv[count] );
  142.                     /* debug ****
  143.                     strcpy( str, fname );
  144.                     putmessage();
  145.                     /****/
  146.                 }
  147.             }        /* if  ret */
  148.         }        /* for count */
  149.     }         /* if  argc */
  150.     return ret;
  151. }
  152.  
  153.  
  154. /***************************************************************
  155. 【デ-タファイルを読み込む】
  156.  
  157.         概要    
  158.         用法    loaddata();
  159.         引数    char    *Data
  160.         戻り値    int        0            : 成功
  161.                         -1            : 失敗
  162.                         !0 or !-1    : diskのフォ-マットの種類
  163.         注意    無し
  164. ***************************************************************/
  165.  
  166. int loaddata ( char *Data )
  167. {
  168.     int        ret = 0;
  169.     int        rsize;
  170.  
  171.     if ( access( fname, 0 ) != 0 ) {
  172.         flagerr = 1;
  173.         strcpy( str, "デ-タファイルが見つかりません。" );
  174.         putmessage();
  175.         ready();
  176.         ret = -1;
  177.         flagerr = 0;
  178.     }
  179.     else {
  180.         pan = _open( fname, _O_BINARY | _O_RDWR );
  181.         if ( pan == -1 ) {
  182.             flagerr = 1;
  183.             strcpy( str, "ファイルのオ-プンに失敗しました。" );
  184.             putmessage();
  185.             ready();
  186.             ret = -1;
  187.             flagerr = 0;
  188.         }
  189.  
  190.         rsize = _read( pan, Headdata, 32 );
  191.         if ( rsize == -1 || rsize != 32 ) {
  192.             flagerr = 1;
  193.             strcpy( str, "ヘッダの読み込みに失敗しました。" );
  194.             putmessage();
  195.             ready();
  196.             _close( pan );
  197.             ret = -1;
  198.             flagerr = 0;
  199.         }
  200.  
  201.         if ( strncmp( Headdata, "DISKDUP ", 8 ) != 0 ) {
  202.             flagerr = 1;
  203.             strcpy( str, "DISKDUPのデ-タファイルではありません。" );
  204.             putmessage();
  205.             ready();
  206.             _close( pan );
  207.             ret = -1;
  208.             flagerr = 0;
  209.         }
  210.         else {
  211.             if (( ret = gethead() ) != -1 ) {
  212.                 rsize = _read( pan, Data, dtlong );
  213.             }
  214.             if ( rsize == -1 || rsize != dtlong || ret == -1 ) {
  215.                 flagerr = 1;
  216.                 _close( pan );
  217.                 strcpy( str, "デ-タファイルの読み込みに失敗しました。" );
  218.                 putmessage();
  219.                 ready();
  220.                 ret = -1;
  221.                 flagerr = 0;
  222.             }
  223.             else {
  224.                 _close(pan);
  225.             }
  226.         }
  227.     }
  228.     return ret;
  229. }
  230.  
  231.  
  232. /***************************************************************
  233. 【デ-タファイルを作成する】
  234.  
  235.         概要    
  236.         用法    savedata();
  237.         引数    無し
  238.         戻り値    int            0     : 成功
  239.                             -1    : 失敗
  240.         注意    無し
  241. ***************************************************************/
  242.  
  243. int savedata ( char *Data, int sw )
  244. {
  245.     int        ret = 0;
  246.     int        wsize;
  247.  
  248.     if ( _access( fname, 0 ) == 0 ) {
  249.         flagerr = 1;
  250.         strcpy( str, "同名のファイルがあります。上書きして良いですか。" );
  251.         putmessage();
  252.         if ( select() == 1 ) {
  253.             ret = -1;
  254.         }
  255.     }
  256.  
  257.     flagerr = 0;
  258.     if ( ret == 0 ) {
  259.         pan = _open( fname,_O_BINARY | _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE );
  260.         if ( pan == -1 ) {
  261.             ret = -1;
  262.         }
  263.         if ( ret == 0 ) {
  264.             makehead( sw );
  265.             wsize = _write( pan, Headdata, 32 );
  266.             if ( wsize == -1 || wsize != 32 ) {
  267.                 flagerr = 1;
  268.                 strcpy( str, "ヘッダの書き込みに失敗しました。" );
  269.                 putmessage();
  270.                 ready();
  271.                 _close( pan );
  272.                 ret = -1;
  273.                 flagerr = 0;
  274.             }
  275.         }
  276.         if ( ret == 0 ) {
  277.             wsize = _write( pan, Data, dtlong );
  278.             if ( wsize == -1 || wsize != dtlong ) {
  279.                 flagerr = 1;
  280.                 strcpy( str, "デ-タの書き込みに失敗しました。" );
  281.                 putmessage();
  282.                 ready();
  283.                 _close( pan );
  284.                 _unlink( fname );
  285.                 ret = -1;
  286.                 flagerr = 0;
  287.             }
  288.             else {
  289.                 _close( pan );
  290.             }
  291.         }
  292.     }
  293.     return ret;
  294. }
  295.  
  296.  
  297. /**********************************************************
  298. 【ヘッドデ-タを作る】
  299.  
  300.         概要    
  301.         用法    makehead( sw );
  302.         引数    int        sw        : ヘッダー タイプ    TYPE_2HD_12
  303.                                                 TYPE_2DD_720
  304.                                                 TYPE_2DD_640
  305.                                                 TYPE_2HC_12
  306.         戻り値    無し
  307.         注意    変化する変数 char Headdata[]
  308. **********************************************************/
  309.  
  310. void makehead( int sw )
  311. {
  312.     switch ( sw ) {
  313.         case TYPE_2DD_720:
  314.             strncpy( Headdata, Disk_2DD_720, 32 );
  315.             dtlong = SECLEN512 * MAXSEC_720 * MAXCYL_2DD * MAXHEAD;
  316.             break;
  317.  
  318.         case TYPE_2DD_640:
  319.             strncpy( Headdata, Disk_2DD_640, 32 );
  320.             dtlong = SECLEN512 * MAXSEC_640 * MAXCYL_2DD * MAXHEAD;
  321.             break;
  322.  
  323.         case TYPE_2HC_12:
  324.             strncpy( Headdata, Disk_2HC_120, 32 );
  325.             dtlong = SECLEN512 * MAXSEC_12C * MAXCYL_2HC * MAXHEAD;
  326.             break;
  327.  
  328.         case TYPE_2HD_12:
  329.         default:
  330.             strncpy( Headdata, Disk_2HD_120, 32 );
  331.             dtlong = SECLEN1024 * MAXSEC_12 * MAXCYL_2HD * MAXHEAD;
  332.             break;
  333.     }
  334. }
  335.  
  336.  
  337. /**********************************************************
  338. 【ヘッドデ-タからディスクタイプを得る】
  339.  
  340.         概要    
  341.         用法    gethead();
  342.         引数    無し
  343.         戻り値    int        -1                : エラ-
  344.                         TYPE_2HD_12        : 1.2M 2HD
  345.                         TYPE_2DD_720    : 720K 2DD
  346.                         TYPE_2DD_640    : 640K 2DD
  347.                         TYPE_2HC_12        : 1.2M 2HC
  348.         注意    無し
  349. **********************************************************/
  350.  
  351. int gethead( void )
  352. {
  353.     int disktypes;
  354.  
  355.     if ( strncmp( Headdata, Disk_2HD_120, 32 ) == 0 ) {
  356.         disktypes = TYPE_2HD_12;
  357.         dtlong = SECLEN1024 * MAXSEC_12 * MAXCYL_2HD * MAXHEAD;
  358.         flagerr = 1;
  359.         strcpy( str, "1.2M 2HD" );
  360.         putmessage();
  361.         flagerr = 0;
  362.     } else if ( strncmp( Headdata, Disk_2DD_720, 32 ) == 0 ) {
  363.         disktypes = TYPE_2DD_720;
  364.         dtlong = SECLEN512 * MAXSEC_720 * MAXCYL_2DD * MAXHEAD;
  365.         flagerr = 1;
  366.         strcpy( str, "720K 2DD" );
  367.         putmessage();
  368.         flagerr = 0;
  369.     } else if ( strncmp( Headdata, Disk_2DD_640, 32 ) == 0 ) {
  370.         disktypes = TYPE_2DD_640;
  371.         dtlong = SECLEN512 * MAXSEC_640 * MAXCYL_2DD * MAXHEAD;
  372.         flagerr = 1;
  373.         strcpy( str, "640K 2DD" );
  374.         putmessage();
  375.         flagerr = 0;
  376.     } else if ( strncmp( Headdata, Disk_2HC_120, 32 ) == 0 ) {
  377.         disktypes = TYPE_2HC_12;
  378.         dtlong = SECLEN512 * MAXSEC_12C * MAXCYL_2HC * MAXHEAD;
  379.         flagerr = 1;
  380.         strcpy( str, "1.2M 2HC" );
  381.         putmessage();
  382.         flagerr = 0;
  383.     } else {
  384.         disktypes = -1;
  385.     }
  386.  
  387.     return disktypes;
  388. }
  389.  
  390.  
  391. /* end of file */
  392.